package br.com.dallasmotopecas.seguranca.perfil.managerbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DualListModel;

import br.com.dallasmotopecas.seguranca.perfil.controller.PerfilController;
import br.com.dallasmotopecas.seguranca.perfil.controller.SegurancaController;
import br.com.dallasmotopecas.seguranca.perfil.vo.PerfilVo;
import br.com.dallasmotopecas.seguranca.perfil.vo.SegurancaVo;
import br.com.dallasmotopecas.util.exception.AlterarObjetoException;
import br.com.dallasmotopecas.util.exception.CampoObrigatorioException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.DeletarObjetoException;
import br.com.dallasmotopecas.util.exception.DirecionamentoPaginaException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;
import br.com.dallasmotopecas.util.managerbean.AbstractManagerBean;
@ManagedBean(name="perfilManagerBean")
@ViewScoped
public class PerfilManagerBean extends AbstractManagerBean implements Serializable
{
	private static final long serialVersionUID = 1L;
	private DualListModel<SegurancaVo> listaDuplaSeguranca;
	private List<SegurancaVo> listaSegurancaTarget;
	private List<SegurancaVo> listaSegurancaSource;
	private PerfilVo perfilVo;
	private List<PerfilVo> listaPerfil;
	
	
	public PerfilManagerBean()
	{
		
	}
	
	@PostConstruct
	public void inicializar()
	{
		try
		{
			if (!isUsuarioLogado())
			{
				redirecionarPagina("/Index.jsf");
				return;
			}
			processaPermissaoUsuario(getUsuarioLogado());
			carregarListaPerfil();
		}
		catch(DirecionamentoPaginaException e)
		{
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
	}
	
	@PreDestroy
	public void destroy()
	{
		if (getListaDuplaSeguranca() != null)
		{
			getListaDuplaSeguranca().getSource().clear();
			getListaDuplaSeguranca().getTarget().clear();
			setListaDuplaSeguranca(null);
		}
		
		if (getListaSegurancaSource() != null)
		{
			getListaSegurancaSource().clear();
			setListaSegurancaSource(null);
		}

		if (getListaSegurancaTarget() != null)
		{
			getListaSegurancaTarget().clear();
			setListaSegurancaTarget(null);
		}
		
		setPerfilVo(null);
		
		if (getListaPerfil() != null)
		{
			getListaPerfil().clear();
			setListaPerfil(null);
		}
	}

	public DualListModel<SegurancaVo> getListaDuplaSeguranca()
	{
		if (listaDuplaSeguranca == null) listaDuplaSeguranca = new DualListModel<SegurancaVo>();
		return listaDuplaSeguranca;
	}

	public void setListaDuplaSeguranca(DualListModel<SegurancaVo> listaDuplaSeguranca)
	{
		this.listaDuplaSeguranca = listaDuplaSeguranca;
	}

	public List<SegurancaVo> getListaSegurancaTarget()
	{
		if (listaSegurancaTarget == null) listaSegurancaTarget = new ArrayList<SegurancaVo>();
		
		return listaSegurancaTarget;
	}

	public void setListaSegurancaTarget(List<SegurancaVo> listaSegurancaTarget)
	{
		this.listaSegurancaTarget = listaSegurancaTarget;
	}

	public List<SegurancaVo> getListaSegurancaSource()
	{
		if (listaSegurancaSource == null) listaSegurancaSource = new ArrayList<SegurancaVo>();
		
		return listaSegurancaSource;
	}

	public void setListaSegurancaSource(List<SegurancaVo> listaSegurancaSource)
	{
		this.listaSegurancaSource = listaSegurancaSource;
	}

	public PerfilVo getPerfilVo()
	{
		if (perfilVo == null) perfilVo = new PerfilVo();
		return perfilVo;
	}

	public void setPerfilVo(PerfilVo perfilVo)
	{
		this.perfilVo = perfilVo;
	}

	public List<PerfilVo> getListaPerfil()
	{
		if (listaPerfil == null) listaPerfil = new ArrayList<PerfilVo>();
		return listaPerfil;
	}

	public void setListaPerfil(List<PerfilVo> listaPerfil)
	{
		this.listaPerfil = listaPerfil;
	}
	
	private void carregarListaPerfil()
	{
		PerfilController perfilController = null;
		try
		{
			perfilController = new PerfilController(getContexto());
			perfilController.carregarListaPerfil(getListaPerfil());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (perfilController != null)
			{
				perfilController.close();
				perfilController = null;
			}
		}
	}
	
	public void novoPerfil()
	{	
		SegurancaController segurancaController = null;
		try
		{
			getPerfilVo().setId(0);
			getPerfilVo().setDescricao("");
			getPerfilVo().getListaPerfilSeguranca().clear();
			getListaSegurancaTarget().clear();
			getListaSegurancaSource().clear();
			segurancaController = new SegurancaController(getContexto());
			segurancaController.carregarListaSeguranca(getListaSegurancaSource());
			getListaDuplaSeguranca().setTarget(getListaSegurancaTarget());
			getListaDuplaSeguranca().setSource(getListaSegurancaSource());
			abrirModal("perfilAlterarDialog");
		}
		catch(ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (segurancaController != null)
			{
				segurancaController.close();
				segurancaController = null;
			}
		}
	}
	
	public void alterarPerfil(PerfilVo perfilVo)
	{
		SegurancaController segurancaController = null;
		List<SegurancaVo> listaSeguranca = null;
		boolean addLista = false;
		try
		{
			getPerfilVo().setId(perfilVo.getId());
			getPerfilVo().setDescricao(perfilVo.getDescricao());
			getPerfilVo().getListaPerfilSeguranca().clear();
			getPerfilVo().getListaPerfilSeguranca().addAll(perfilVo.getListaPerfilSeguranca());
			listaSeguranca = new ArrayList<SegurancaVo>();
			segurancaController = new SegurancaController(getContexto());
			segurancaController.carregarListaSeguranca(listaSeguranca);
			getListaSegurancaSource().clear();
			getListaSegurancaTarget().clear();
			for (int i = 0; i < listaSeguranca.size(); i++)
			{
				addLista = true;
				for (int j = 0; j < getPerfilVo().getListaPerfilSeguranca().size(); j++)
				{	
					if (listaSeguranca.get(i).getId() == getPerfilVo().getListaPerfilSeguranca().get(j).getSegurancaVo().getId())
					{
						getListaSegurancaTarget().add(listaSeguranca.get(i));
						addLista = false;
					}	
				}
				if (addLista)
					getListaSegurancaSource().add(listaSeguranca.get(i));
			}
			
			getListaDuplaSeguranca().setSource(getListaSegurancaSource());
			getListaDuplaSeguranca().setTarget(getListaSegurancaTarget());
			abrirModal("perfilAlterarDialog");
		}
		catch(ListarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (segurancaController != null)
			{
				segurancaController.close();
				segurancaController = null;
			}
		}
	}
	
	public void gravarPerfil()
	{
		PerfilController perfilController = null;
		try
		{
			perfilController = new PerfilController(getContexto());
			
			if (getPerfilVo().getId() == 0)
				perfilController.inserirPerfil(getPerfilVo(), getListaDuplaSeguranca().getTarget());
			else
				perfilController.alterarPerfil(getPerfilVo(), getListaDuplaSeguranca().getTarget());
			
			carregarListaPerfil();
			
			fecharModal("perfilAlterarDialog");
		}
		catch(ConexaoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (ClasseNaoEncontradaException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (CampoObrigatorioException e)
		{	
			processarMensagem(MENSAGEM_INFORMATIVA, e.getMessage());
		}
		catch (InserirObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (AlterarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		catch (DeletarObjetoException e)
		{
			e.printStackTrace();
			processarMensagem(MENSAGEM_FATAL, e.getMessage());
		}
		finally
		{
			if (perfilController != null)
			{
				perfilController.close();
				perfilController = null;
			}
		}
	}
	
	public void sair()
	{
		try
		{
			redirecionarPagina("/view/seguranca/Home.jsf");
		}
		catch (DirecionamentoPaginaException e)
		{
			e.printStackTrace();
		}
	}
}
